#include "bsp/bsp.h"
#include "driver/leds.h"

static GPIO_TypeDef *m_port_map[] = {GPIOA, GPIOB, GPIOC, GPIOD, GPIOE};

static uint32_t m_pin_map[] = {LL_GPIO_PIN_0,  LL_GPIO_PIN_1,  LL_GPIO_PIN_2,  LL_GPIO_PIN_3,
                               LL_GPIO_PIN_4,  LL_GPIO_PIN_5,  LL_GPIO_PIN_6,  LL_GPIO_PIN_7,
                               LL_GPIO_PIN_8,  LL_GPIO_PIN_9,  LL_GPIO_PIN_10, LL_GPIO_PIN_11,
                               LL_GPIO_PIN_12, LL_GPIO_PIN_13, LL_GPIO_PIN_14, LL_GPIO_PIN_15};

led_t board_leds[] = {{2, 14, 0}};

void bsp_gpio_pin_set_output(uint8_t port, uint8_t pin) {
  LL_GPIO_InitTypeDef gpio_cfg;
  LL_GPIO_StructInit(&gpio_cfg);

  gpio_cfg.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  gpio_cfg.Mode = LL_GPIO_MODE_OUTPUT_2MHz;
  gpio_cfg.Pin = m_pin_map[pin];
  LL_GPIO_Init(m_port_map[port], &gpio_cfg);
  LL_GPIO_SetOutputPin(m_port_map[port], m_pin_map[pin]);
}

void bsp_gpio_set_pin(uint8_t port, uint8_t pin) { LL_GPIO_SetOutputPin(m_port_map[port], m_pin_map[pin]); }

void bsp_gpio_clear_pin(uint8_t port, uint8_t pin) { LL_GPIO_ResetOutputPin(m_port_map[port], m_pin_map[pin]); }

void bsp_gpio_toggle_pin(uint8_t port, uint8_t pin) { LL_GPIO_TogglePin(m_port_map[port], m_pin_map[pin]); }

void bsp_led_init(void) {
  for (int i = 0; i < LED_COUNT; i++) {
    bsp_gpio_pin_set_output(board_leds[i].port, board_leds[i].pin);
  }
}